package com.example.springcloudmodelserver.service;

import cn.hutool.crypto.SecureUtil;
import com.example.springcloudmodelserver.Result.JsonResult;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.security.Security;
import java.util.UUID;

@Service
public class Uploadservice {
    /**模型保存路径*/
    String path = "D:\\upload\\";
    /**功能说明书保存路径*/
    String funpath = "D:\\upload\\fun\\";

    /**
     * 模型文件上传*/
    public File UploadFile (MultipartFile file) {
        //获取上传文件名,包含后缀
        String originalFilename = file.getOriginalFilename();
        //获取后缀
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        //保存的文件名
        String dFileName = UUID.randomUUID() + originalFilename;
        //生成保存文件
        //首先看看父类文件夹有没有
//        if(!uploadFile.exists()){
//            uploadFile.mkdirs();
//        }
        return new File(path+dFileName);
    }
    public File UploadFunFile (MultipartFile file) {
        return new File(funpath+file.getOriginalFilename());
    }


    /**
     * 模型文件上传
     * 通过文件头判断文件类型*/
    public boolean checkType (MultipartFile File) {
        byte[] b = new byte[3];
        try {
            //截取输入流文件信息
            File.getInputStream().read(b,0, b.length);
            //获取文件头信息
            String suffix = bytesToHexString(b);
            suffix = suffix.toUpperCase();
            switch (suffix){
//                case "FFD8FF"://jgp文件格式的文件头
//                    return true;
//                case "d0cf11e0"://doc文件
//                    return true;
                case "080112":
                    return true;//ONNX文件
                default:
                    return false;
            }
        } catch (IOException e) {
            return false;
        }
    }
    public boolean checkIndentityType (MultipartFile File) {
        byte[] b = new byte[3];
        try {
            //截取输入流文件信息
            File.getInputStream().read(b,0, b.length);
            //获取文件头信息
            String suffix = bytesToHexString(b);
            suffix = suffix.toUpperCase();
            switch (suffix){
                case "FFD8FF"://jgp文件格式的文件头
                    return true;
                case "AC9EBD8F"://pdf文件格式的文件头
                    return true;
                default:
                    return false;
            }
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * 将字节数组转化为16进制的字符串*/
    public String bytesToHexString(byte[] src) {
        //构建新的字符串列
        StringBuilder stringBuilder = new StringBuilder();
        if(src == null || src.length <= 0) {
            return null;
        }
        //转为16进制
        for(int i =0;i<src.length;i++){
            int v =src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if(hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 为上传文件计算字节数组的MD5值，并保存在数据库中，防止文件重复上传*/
    public String checkMD5 (MultipartFile File) throws IOException {
//        byte[] bytes = File.getBytes();
       try {
           String md5 = SecureUtil.md5(File.getInputStream());
           return md5;
       }catch (IOException e) {
           return "IOExcetion e";
       }

    }

}
